package sweet_heart;

import com.google.common.base.Preconditions;
import lombok.extern.slf4j.Slf4j;

/**
 * 甜心表达式,相比cron表达式更加简单 只支持常用的规则
 * <pre>
 * 业务场景支持
 *
 * 实时                     rn 立即执行
 * 延迟执行                  de .../s00-59/m00-59/h0/23 Delay execution
 * 当天执行                  cd [00-59 00-59-59 00-23]  当天只执行一次
 *
 *
 * 具有间隔的重复             pr .../s00-59/m00-59/h0/23 含有时间间隔的执行
 *
 *
 * 某一天的某个时间点          md [00-59 00-59-59 00-23]
 * 某一周的xx                mw [00-59 00-59-59 00-23] 1-2-3-4-5-6-7
 * 某一个月的开始第几天和末几天  mm [00-59 00-59-59 00-23] 1-2...28--1--2--3
 *
 * 月和年进行处理是没有任何的意义
 * </pre>
 */
@Slf4j
public class Expression {


    public static ExpressionContext parse(String string) {
        Preconditions.checkNotNull(string, "string is null");
        string = string.trim();
        if (string.equals(ExpressionType.right_now.getValue())) {
            log.info("rn:立即执行");
            ExpressionContext expressionContext = new ExpressionContext(ExpressionType.right_now, string);
            //马上执行
            return expressionContext;
        } else if (string.startsWith(ExpressionType.current_day.getValue())) {
            log.info("rn:当天执行");
            ExpressionContext expressionContext = new ExpressionContext(ExpressionType.current_day, string);
            //解析当天什么时候进行调度
            expressionContext.parse();
            return expressionContext;
        } else if (string.startsWith(ExpressionType.periodic_repetition.getValue())) {
            log.info("rn:周期性间隔执行");//pr s/m/h
            ExpressionContext expressionContext = new ExpressionContext(ExpressionType.periodic_repetition, string);
            //周期性间隔多少执行
            expressionContext.parse();
            return expressionContext;

        } else if (string.startsWith(ExpressionType.day_repetition.getValue())) {
            log.info("rn:每天...时间执行");
            ExpressionContext expressionContext = new ExpressionContext(ExpressionType.day_repetition, string);
            //每个月第几天进行调度
            expressionContext.parse();
            return expressionContext;

        } else if (string.startsWith(ExpressionType.week_repetition.getValue())) {
            log.info("rn:每周的...天...时间执行");//1-7
            ExpressionContext expressionContext = new ExpressionContext(ExpressionType.week_repetition, string);
            //每周第几天进行调度
            expressionContext.parse();
            return expressionContext;

        } else if (string.startsWith(ExpressionType.month_repetition.getValue())) {
            log.info("rn:每月的...天...时间执行");//1-31
            ExpressionContext expressionContext = new ExpressionContext(ExpressionType.month_repetition, string);
            //每年第几月进行调度
            expressionContext.parse();
            return expressionContext;

        } else {
            throw new RuntimeException("else");
        }
    }


}
